<?php
/**
 * 表单助手类
 *
 * @author Mo yi <root@imoi.cn>
 * @link   http://www.imoi.cn
 * @copyright Copyright &copy; 2010-2012 DuoLam Software LLC
 * @license http://www.imoi.cn/license/
 * @version $Id: dpForm.php 2799 2012-03-30 09:31:13Z Mo.yi $
 * @package web.helper
 * @since 1.0
 */

class dpForm
{

	/**
	 * -- help -- 
	 * required				如果元素为空，则返回FALSE	 
	 * is_unique			如果表单元素的值与指定数据表栏位有重复，则返回False（译者注：比如is_unique[User.Email]，那么验证类会去查找User表中Email栏位有没有与表单元素一样的值，如存重复，则返回false，这样开发者就不必另写Callback验证代码。）	is_unique[table.field]
	 * min_length			如果表单元素值的字符长度少于参数中定义的数字，则返回FALSE	min_length[6]
	 * max_length			如果表单元素值的字符长度大于参数中定义的数字，则返回FALSE	max_length[12]
	 * exact_length			如果表单元素值的字符长度与参数中定义的数字不符，则返回FALSE	exact_length[8]
	 * greater_than			如果表单元素值是非数字类型，或小于参数定义的值，则返回FALSE	greater_than[8]
	 * less_than			如果表单元素值是非数字类型，或大于参数定义的值，则返回FALSE	less_than[8]
	 * alpha				如果表单元素值中包含除字母以外的其他字符，则返回FALSE	 
	 * alpha_numeric		如果表单元素值中包含除字母和数字以外的其他字符，则返回FALSE	 
	 * alpha_dash			如果表单元素值中包含除字母/数字/下划线/破折号以外的其他字符，则返回FALSE	 
	 * numeric				如果表单元素值中包含除数字以外的字符，则返回 FALSE	 
	 * integer				如果表单元素中包含除整数以外的字符，则返回FALSE	 
	 * decimal				如果表单元素中输入（非小数）不完整的值，则返回FALSE	 
	 * is_natural			如果表单元素值中包含了非自然数的其他数值 （其他数值不包括零），则返回FALSE。自然数形如：0,1,2,3....等等。	 
	 * is_natural_no_zero	如果表单元素值包含了非自然数的其他数值 （其他数值包括零），则返回FALSE。非零的自然数：1,2,3.....等等。	 
	 * valid_email			如果表单元素值包含不合法的email地址，则返回FALSE	 
	 * valid_ip				如果表单元素的值不是一个合法的IP地址，则返回FALSE。
	 * match				如果表单元素的值不符合第二参数正则，则返回FALSE	matches[form_item]
	 */

	/**
	 * 构造函数
	 */
	public function __construct($request = array())
	{
		$this->request = empty($request) || !is_array($request) ? $_REQUEST : $request;
	}

	/**
	 * 验证函数
	 * valid('username', array('required' => 'error!', 'min_length:6' , 'valid_email'))
	 */
	public function valid($rules)
	{
		if (func_num_args() > 1) {
			if (is_string($rules) && array_key_exists($rules, $this->request))
				$test = $this->request[$rules];
			else return false;
			$rules = (array) func_get_arg(1);
			foreach ($rules as $key => $rule) {
				unset($message);
				if (is_string($key)) {
					$message = $rule;
					$rule = $key;
				}
				$option = explode(':', $rule);
				count($option) < 2 && $option[1] = null;
				$return[$rule] = call_user_func(array($this, current($option)), $test, $option[1]);
				if ($return[$rule] == false && isset($message))
					$return[$rule] = $message;
			}
			return count($return) > 1 ? $return : current($return);
		}
		return false;
	}

	/**
	 * 循环valid
	 */
	public function each_valid()
	{
		foreach (func_get_args() as $rules) {
			$field = current($rules);
			$return[$field] = call_user_func_array(array($this, 'valid'), $rules);
		}
		return $return;
	}

	/**
	 * 表单元素的值为空，则返回False
	 */
	public function required($str)
	{
		return trim($str) ? true : false;
	}

	/**
	 * 表单元素的值与指定数据表栏位有重复，则返回False
	 */
	public function is_unique($str, $context = array())
	{
		if (!is_array($context)) return false;
		empty($context) && $context = $this->request;
		return in_array($str, $context);
	}

	/**
	 * 表单元素值的字符长度少于参数中定义的数字，则返回False
	 */
	public function min_length($str, $length = 6)
	{
		return strlen($str) < $length ? false : true;
	}

	/**
	 * 表单元素值的字符长度大于参数中定义的数字，则返回False
	 */
	public function max_length($str, $length = 6)
	{
		return strlen($str) < $length ? true : false;
	}

	/**
	 * 表单元素值的字符长度与参数中定义的数字不符，则返回False
	 */
	public function exact_length($str, $length = 6)
	{
		return strlen($str) == $length ? true : false;
	}

	/**
	 * 表单元素值是非数字类型，或小于参数定义的值，则返回False
	 */
	public function greater_than($str, $int)
	{
		return strlen($str) > $int ? true : false;
	}

	/**
	 * 表单元素值是非数字类型，或大于参数定义的值，则返回False
	 */
	public function less_than($str, $int)
	{
		return strlen($str) < $int ? true : false;
	}

	/**
	 * 表单元素值中包含除字母以外的其他字符，则返回False
	 */
	public function alpha($str)
	{
		return preg_match('/[a-zA-Z]+/', $str);
	}

	/**
	 * 表单元素值中包含除字母和数字以外的其他字符，则返回False
	 */
	public function alpha_numeric($str)
	{
		return preg_match('/[a-zA-Z0-9]+/', $str);
	}

	/**
	 * 表单元素值中包含除字母/数字/下划线/破折号以外的其他字符，则返回False
	 */
	public function alpha_dash($str)
	{
		return preg_match('/[a-zA-Z0-9_-]+/', $str);
	}

	/**
	 * 表单元素值中包含除数字以外的字符，则返回False
	 */
	public function numeric($str)
	{
		return preg_match('/\d+/', $str);
	}

	/**
	 * 表单元素中包含除整数以外的字符，则返回False
	 */
	public function integer($str)
	{
		return preg_match('/[0-9]+/', $str);
	}

	/**
	 * 表单元素中输入（非小数）不完整的值，则返回False
	 */
	public function decimal($str)
	{
		return preg_match('/[0-9]+\.[0-9]+/', $str);
	}

	/**
	 * 表单元素值中包含了非自然数的其他数值 （其他数值不包括零），则返回False
	 */
	public function is_natural($str)
	{
		return preg_match('/[0-9]+/', $str);
	}

	/**
	 * 表单元素值包含了非自然数的其他数值 （其他数值包括零），则返回False
	 */
	public function is_natural_no_zero($str)
	{
		return preg_match('/[0-9]+/', $str) && $str > 0;
	}

	/**
	 * 表单元素值包含不合法的email地址，则返回False
	 */
	public function valid_email($str)
	{
		return preg_match('/\w+\@\w+\.\w{2,4}/', $str);
	}

	/**
	 * 表单元素的值不是一个合法的IP地址，则返回False
	 */
	public function valid_ip($str)
	{
		if (!preg_match('/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/', $str));
			return false;
		foreach(explode('.', $str) as $segment)
			if($segment > 255) return false;
	}

	/**
	 * 表单元素的值不符合第二参数正则，则返回False
	 */
	public function match($str, $re)
	{
		return preg_match($re, $str);
	}

}

?>